Ext.namespace("comunes");

/**
 * Crea un objeto tipo TextField con las caracteristicas de ExtJs.
 * @param (string) identificador unico dentro del sitio del objeto
 * @param (string) Label del objeto
 * @param (int) Ancho en caracteres que debe medir el TextField
 * @param (int) Numero de caracteres minimos
 * @param (int) Numero de caracteres maximos
 * @param (boolean) Indica si el campo TextField es un dato exigido o no dentro del formulario
 * @param (boolean) Indica si se muestra el signo * que indica que es campo obligatorio
 * @param (boolean) Indica si el TextField es de solo lectura o no
 * @param (string) Nombre de la funcion que se utilizara para realizar alguna validacion
 * @param (string) Nombre de la funcion que se utilizara para realizar algo al presionar ENTER o RETORNO
 * @param (string) Id del objeto que tomara el foco en caso de presionar ENTER o RETORNO
 * @param (string) <optional> (argumento 11) Valor que se mostrara dentro del textField.
 * @returns (object) Objeto TextField configurado segun los parametros enviados
 */
comunes.crear_text_formulario = function(p_str_id,p_str_label,p_int_anchoTextField,p_int_caracteresMinimos,
p_int_caracteresMaximos,p_boo_campoObligatorio,p_boo_muestraObligatorios,p_boo_readOnly,
p_str_funcion_validacion,p_str_funcion_accion,p_str_nextFocus,p_str_css){
    if (Ext.getCmp(p_str_id) != undefined){
        Ext.MessageBox.show({
            title: 'Advertencia',
            msg: 'Ya se encuentra un componente ExtJs declarado con el identificador "' + p_str_id + '".',
            buttons: Ext.Msg.OK,
            icon: Ext.MessageBox.INFO
        });
        p_str_id = 'No_definido_'+Math.random();
    }
    p_int_anchoTextField = p_int_anchoTextField * 8
    if (p_int_anchoTextField > 380) {
        p_int_anchoTextField = 380;
    }
    if (p_int_caracteresMinimos < 1 || p_int_caracteresMinimos == ''){
        p_int_caracteresMinimos = null;
    }
    if (p_int_caracteresMaximos < 1 || p_int_caracteresMaximos == ''){
        p_int_caracteresMaximos = null;
    }
    if (p_boo_campoObligatorio == true && p_boo_muestraObligatorios == true) {
        p_str_label = p_str_label + '<font color="red">*</font> ';
    }
    if (p_str_funcion_validacion == "" || p_str_funcion_validacion == null) {
        p_str_funcion_validacion = null;
    }
    if (p_str_funcion_validacion != "" && p_str_funcion_validacion != null) {
        p_str_funcion_validacion = eval(p_str_funcion_validacion);
    }
    if (arguments.length>11){
        p_str_valor = arguments[12];
    }
    else{
        p_str_valor='';
    }
    return new Ext.form.TextField({
        nextFocus: p_str_nextFocus,
        fieldLabel: p_str_label,
        name: p_str_id,
        id: p_str_id,
        allowBlank: !p_boo_campoObligatorio,
        width: p_int_anchoTextField,
        minLength: p_int_caracteresMinimos,
        maxLength: p_int_caracteresMaximos,
        readOnly: p_boo_readOnly,
        enableKeyEvents: true,
        value: p_str_valor,
        cls:p_str_css,
        validator: p_str_funcion_validacion,
        onBlur : function() {
            this.setValue(this.getValue().trim());
        },
        listeners: {
            specialKey: function(field, el){
                if (el.getKey() == Ext.EventObject.ENTER ||
                    el.getKey() == Ext.EventObject.RETURN /*||
                    el.getKey() == Ext.EventObject.TAB*/) {
                    if (p_str_funcion_accion != "" && p_str_funcion_accion != null) {
                        eval(p_str_funcion_accion + '(this);');
                    }
                    if (field.nextFocus != '' && field.nextFocus != undefined && field.nextFocus != null
                        && el.getKey() == Ext.EventObject.ENTER && (p_str_funcion_accion =='' || p_str_funcion_accion==undefined)){
                        Ext.getCmp(field.nextFocus).focus(true,10);
                    }
                }
            }
        }
    });
}

/**
 * Crea un objeto tipo hidden con las caracteristicas de ExtJs.
 * @param (string) identificador unico dentro del sitio del objeto
 * @param (string) Valor que tendra el campo
 * @returns (object) Objeto hidden configurado
 */
comunes.crear_text_hidden = function(p_str_id, p_str_valor){
    return new Ext.form.TextField({
        id: p_str_id,
        name: p_str_id,
        value: p_str_valor,
        hidden: true        
    })
};

/**
 * Crea un objeto tipo TextField Password con las caracteristicas de ExtJs.
 * @param (string) identificador unico dentro del sitio del objeto
 * @param (string) Label del objeto
 * @param (int) Ancho en caracteres que debe medir el TextField
 * @param (int) Numero de caracteres minimos
 * @param (int) Numero de caracteres maximos
 * @param (boolean) Indica si el campo TextField es un dato exigido o no dentro del formulario
 * @param (boolean) Indica si se muestra el signo * que indica que es campo obligatorio
 * @param (boolean) Indica si el TextField es de solo lectura o no
 * @param (string) Nombre de la funcion que se utilizara para realizar alguna validacion
 * @param (string) Nombre de la funcion que se utilizara para realizar algo al presionar ENTER o RETORNO
 * @param (string) Id del objeto que tomara el foco en caso de presionar ENTER o RETORNO
 * @param (string) <optional> (argumento 11) Valor que se mostrara dentro del textField.
 * @returns (object) Objeto TextField Password configurado segun las opciones enviadas por parametro
 */
comunes.crear_password_formulario = function(p_str_id,p_str_label,p_int_anchoTextField,p_int_caracteresMinimos,
p_int_caracteresMaximos,p_boo_campoObligatorio,p_boo_muestraObligatorios,p_boo_readOnly,
p_str_funcion_validacion,p_str_funcion_accion,p_str_nextFocus){
    if (Ext.getCmp(p_str_id) != undefined){
        Ext.MessageBox.show({
            title: 'Advertencia',
            msg: 'Ya se encuentra un componente ExtJs declarado con el identificador "' + p_str_id + '".',
            buttons: Ext.Msg.OK,
            icon: Ext.MessageBox.INFO
        });
        p_str_id = 'No_definido_'+Math.random();
    }
    p_int_anchoTextField = p_int_anchoTextField * 8
    if (p_int_anchoTextField > 380) {
        p_int_anchoTextField = 380;
    }
    if (p_int_caracteresMinimos < 1 || p_int_caracteresMinimos == ''){
        p_int_caracteresMinimos = null;
    }
    if (p_int_caracteresMaximos < 1 || p_int_caracteresMaximos == ''){
        p_int_caracteresMaximos = null;
    }
    if (p_boo_campoObligatorio == true && p_boo_muestraObligatorios == true) {
        p_str_label = p_str_label + '<font color="red">*</font> ';
    }
    if (p_str_funcion_validacion == "" || p_str_funcion_validacion == null) {
        p_str_funcion_validacion = null;
    }
    if (p_str_funcion_validacion != "" && p_str_funcion_validacion != null) {
        p_str_funcion_validacion = eval(p_str_funcion_validacion);
    }
    if (arguments.length>10){
        p_str_valor = arguments[11];
    }
    else{
        p_str_valor='';
    }
    return new Ext.form.TextField({
        nextFocus: p_str_nextFocus,
        fieldLabel: p_str_label,
        name: p_str_id,
        id: p_str_id,
        inputType: 'password',
        allowBlank: !p_boo_campoObligatorio,
        width: p_int_anchoTextField,
        minLength: p_int_caracteresMinimos,
        maxLength: p_int_caracteresMaximos,
        readOnly: p_boo_readOnly,
        enableKeyEvents: true,
        value: p_str_valor,
        validator: p_str_funcion_validacion,
        listeners: {
            specialKey: function(field, el){
                if (el.getKey() == Ext.EventObject.ENTER ||
                    el.getKey() == Ext.EventObject.RETURN /*||
                    el.getKey() == Ext.EventObject.TAB*/) {
                    if (p_str_funcion_accion != "" && p_str_funcion_accion != null) {
                        eval(p_str_funcion_accion + '(this);');
                    }
                    if (field.nextFocus != '' && field.nextFocus != undefined && field.nextFocus != null
                        && el.getKey() == Ext.EventObject.ENTER && (p_str_funcion_accion =='' || p_str_funcion_accion==undefined)){
                        Ext.getCmp(field.nextFocus).focus(true,10);
                    }
                }
            }
        }
    });
}

/**
 * Crea un objeto tipo NumberField con las caracter�sticas de ExtJs.
 * @param (string) identificador unico dentro del sitio del objeto
 * @param (string) Label del objeto
 * @param (int) Ancho en caracteres que debe medir el NumberField
 * @param (int) Numero de caracteres minimos
 * @param (int) Numero de caracteres maximos
 * @param (boolean) Indica si el campo NumberField es un dato exigido o no dentro del formulario
 * @param (boolean) Indica si se muestra el signo * que indica que es campo obligatorio
 * @param (boolean) Indica si el NumberField es de solo lectura o no
 * @param (string) Nombre de la funcion que se utilizara para realizar alguna validacion
 * @param (string) Nombre de la funcion que se utilizara para realizar algo al presionar ENTER o RETORNO
 * @param (string) Id del objeto que tomara el foco en caso de presionar ENTER o RETORNO
 * @param (string) <optional> (argumento 11) Valor que se mostrara dentro del NumberField.
 * @returns (object) Objeto NumberField configurado segun las opciones enviadas por parametro
 */
comunes.crear_number_formulario = function(p_str_id,p_str_label,p_int_anchoTextField,p_int_caracteresMinimos,
p_int_caracteresMaximos,p_boo_campoObligatorio,p_boo_muestraObligatorios,p_boo_readOnly,
p_str_funcion_validacion,p_str_funcion_accion,p_str_nextFocus){
    if (Ext.getCmp(p_str_id) != undefined){
        Ext.MessageBox.show({
            title: 'Advertencia',
            msg: 'Ya se encuentra un componente ExtJs declarado con el identificador "' + p_str_id + '".',
            buttons: Ext.Msg.OK,
            icon: Ext.MessageBox.INFO
        });
        p_str_id = 'No_definido_'+Math.random();
    }
    p_int_anchoTextField = p_int_anchoTextField * 8
    if (p_int_anchoTextField > 380) {
        p_int_anchoTextField = 380;
    }
    if (p_int_caracteresMinimos < 1 || p_int_caracteresMinimos == ''){
        p_int_caracteresMinimos = null;
    }
    if (p_int_caracteresMaximos < 1 || p_int_caracteresMaximos == ''){
        p_int_caracteresMaximos = null;
    }
    if (p_boo_campoObligatorio == true && p_boo_muestraObligatorios == true) {
        p_str_label = p_str_label + '<font color="red">*</font> ';
    }
    if (p_str_funcion_validacion == "" || p_str_funcion_validacion == null) {
        p_str_funcion_validacion = null;
    }
    if (p_str_funcion_validacion != "" && p_str_funcion_validacion != null) {
        p_str_funcion_validacion = eval(p_str_funcion_validacion);
    }
    if (arguments.length>10){
        p_str_valor = arguments[11];
    }
    else{
        p_str_valor='';
    }
    return new Ext.form.NumberField({
        nextFocus: p_str_nextFocus,
        fieldLabel: p_str_label,
        name: p_str_id,
        id: p_str_id,
        allowBlank: !p_boo_campoObligatorio,
        width: p_int_anchoTextField,
        minLength: p_int_caracteresMinimos,
        maxLength: p_int_caracteresMaximos,
        readOnly: p_boo_readOnly,
        enableKeyEvents: true,
        value: p_str_valor,
        validator: p_str_funcion_validacion,
        listeners: {
            specialKey: function(field, el){
                if (el.getKey() == Ext.EventObject.ENTER ||
                    el.getKey() == Ext.EventObject.RETURN /*||
                    el.getKey() == Ext.EventObject.TAB*/) {
                    if (p_str_funcion_accion != "" && p_str_funcion_accion != null) {
                        eval(p_str_funcion_accion + '(this);');
                    }
                    if (field.nextFocus != '' && field.nextFocus != undefined && field.nextFocus != null
                        && el.getKey() == Ext.EventObject.ENTER && (p_str_funcion_accion =='' || p_str_funcion_accion==undefined)){
                        Ext.getCmp(field.nextFocus).focus(true,10);
                    }
                }
            }
        }
    });
}

/**
 * Crea un objeto tipo DateField con las caracteristicas de ExtJs.
 * @param (string) identificador unico dentro del sitio del objeto
 * @param (string) Label del objeto
 * @param (int) Ancho en caracteres que debe medir el NumberField
 * @param (int) Numero de caracteres minimos
 * @param (int) Numero de caracteres maximos
 * @param (boolean) Indica si el campo NumberField es un dato exigido o no dentro del formulario
 * @param (boolean) Indica si se muestra el signo * que indica que es campo obligatorio
 * @param (boolean) Indica si el NumberField es de solo lectura o no
 * @param (string) Nombre de la funcion que se utilizara para realizar alguna validacion
 * @param (string) Nombre de la funcion que se utilizara para realizar algo al presionar ENTER o RETORNO
 * @param (string) Id del objeto que tomara el foco en caso de presionar ENTER o RETORNO
 * @param (string) <optional> (argumento 11) Valor que se mostrara dentro del NumberField.
 * @returns (object) Objeto NumberField configurado segun las opciones enviadas por parametro
 */
comunes.crear_date_formulario = function(p_str_id,p_str_label,p_int_anchoTextField,p_int_caracteresMinimos,
p_int_caracteresMaximos,p_boo_campoObligatorio,p_boo_muestraObligatorios,p_boo_readOnly,
p_str_funcion_validacion,p_str_funcion_accion,p_str_nextFocus){
    if (Ext.getCmp(p_str_id) != undefined){
        Ext.MessageBox.show({
            title: 'Advertencia',
            msg: 'Ya se encuentra un componente ExtJs declarado con el identificador "' + p_str_id + '".',
            buttons: Ext.Msg.OK,
            icon: Ext.MessageBox.INFO
        });
        p_str_id = 'No_definido_'+Math.random();
    }
    p_int_anchoTextField = p_int_anchoTextField * 8
    if (p_int_anchoTextField > 380) {
        p_int_anchoTextField = 380;
    }
    if (p_int_caracteresMinimos < 1 || p_int_caracteresMinimos == ''){
        p_int_caracteresMinimos = null;
    }
    if (p_int_caracteresMaximos < 1 || p_int_caracteresMaximos == ''){
        p_int_caracteresMaximos = null;
    }
    if (p_boo_campoObligatorio == true && p_boo_muestraObligatorios == true) {
        p_str_label = p_str_label + '<font color="red">*</font> ';
    }
    if (p_str_funcion_validacion == "" || p_str_funcion_validacion == null) {
        p_str_funcion_validacion = null;
    }
    if (p_str_funcion_validacion != "" && p_str_funcion_validacion != null) {
        p_str_funcion_validacion = eval(p_str_funcion_validacion);
    }
    if (arguments.length>10){
        p_str_valor = arguments[11];
    }
    else{
        p_str_valor='';
    }
    if (!p_boo_readOnly){
        return new Ext.form.DateField({
            nextFocus: p_str_nextFocus,
            fieldLabel: p_str_label,
            name: p_str_id,
            id: p_str_id,
            allowBlank: !p_boo_campoObligatorio,
            width: p_int_anchoTextField,
            minLength: p_int_caracteresMinimos,
            maxLength: p_int_caracteresMaximos,
            readOnly: p_boo_readOnly,
            enableKeyEvents: true,
            value: p_str_valor,
            validator: p_str_funcion_validacion,
            listeners: {
                specialKey: function(field, el){
                    if (el.getKey() == Ext.EventObject.ENTER ||
                        el.getKey() == Ext.EventObject.RETURN /*||
                    el.getKey() == Ext.EventObject.TAB*/) {
                        if (p_str_funcion_accion != "" && p_str_funcion_accion != null) {
                            eval(p_str_funcion_accion + '(this);');
                        }
                        if (field.nextFocus != '' && field.nextFocus != undefined && field.nextFocus != null
                            && el.getKey() == Ext.EventObject.ENTER && (p_str_funcion_accion =='' || p_str_funcion_accion==undefined)){
                            Ext.getCmp(field.nextFocus).focus(true,10);
                        }
                    }
                }
            }
        });
    }
    else{
        return comunes.crear_text_formulario(p_str_id,p_str_label,9,'','',p_boo_campoObligatorio,p_boo_muestraObligatorios,p_boo_readOnly,p_str_funcion_validacion,p_str_funcion_accion,p_str_nextFocus,p_str_valor)
    }

}

/**
 * Crea un objeto tipo ComboBox con las caracteristicas de ExtJs.
 * @param (string) identificador unico dentro del sitio del objeto
 * @param (string) Label del objeto
 * @param (int) Ancho en caracteres que debe medir el NumberField
 * @param (boolean) Indica si es un dato exigido o no dentro del formulario
 * @param (boolean) Indica si se muestra el signo * que indica que es campo obligatorio
 * @param (boolean) Indica si el NumberField es de solo lectura o no
 * @param (string) Nombre de la funcion que se utilizara para realizar alguna validacion
 * @param (string) Nombre de la funcion que se utilizara para realizar algo al presionar ENTER o RETORNO
 * @param (object) Store asociado al combobox
 * @param (string) Tipo de store, indica si es LOCAL o REMOTO
 * @param (string) Texto que aparecer� en el combo (ejemplo: Seleccione...)
 * @param (string) Id del objeto que tomara el foco en caso de presionar ENTER o RETORNO
 * @param (string) <optional> (argumento 12) Valor que se mostrara dentro del NumberField.
 * @returns (object) Objeto ComboBox configurado segun las opciones enviadas por para�metro
 */
comunes.crear_combobox_formulario = function(p_str_id,p_str_label,p_int_anchoCombo,p_boo_campoObligatorio,

p_boo_muestraObligatorios,p_boo_readOnly,p_str_funcion_validacion,p_str_funcion_accion,p_obj_store,
p_str_tipoStore,p_str_emptyText,p_str_nextFocus){
    if (Ext.getCmp(p_str_id) != undefined){
        Ext.MessageBox.show({
            title: 'Advertencia',
            msg: 'Ya se encuentra un componente ExtJs declarado con el identificador "' + p_str_id + '".',
            buttons: Ext.Msg.OK,
            icon: Ext.MessageBox.INFO
        });
        p_str_id = 'No_definido_'+Math.random();
    }
    var v_str_trigger_action = 'all';
    p_int_anchoCombo = p_int_anchoCombo * 8
    if (p_int_anchoCombo > 380) {
        p_int_anchoCombo = 380;
    }
    if (p_boo_campoObligatorio == true && p_boo_muestraObligatorios == true) {
        p_str_label = p_str_label + '<font color="red">*</font> ';
    }
    if (p_str_funcion_validacion == "" || p_str_funcion_validacion == null) {
        p_str_funcion_validacion = null;
    }
    if (p_str_funcion_validacion != "" && p_str_funcion_validacion != null) {
        p_str_funcion_validacion = eval(p_str_funcion_validacion);
    }
    if (p_str_tipoStore == ''){
        v_str_modoStore = 'remote';
    }
    else{
        if (p_str_tipoStore == 'LOCAL'){
            v_str_modoStore = 'local';
        }else{
            v_str_modoStore = 'remote';
        } 
    }
    if (arguments.length>11){
        p_str_valor = arguments[12];
    }
    else{
        p_str_valor='';
    }
    if (!p_boo_readOnly){
        return new Ext.form.ComboBox({
            name: p_str_id,
            id: p_str_id,
            fieldLabel: p_str_label,
            allowBlank: !p_boo_campoObligatorio,
            nextFocus: p_str_nextFocus,
            store: p_obj_store,
            valueField: p_obj_store.fields.keys[0],
            displayField: p_obj_store.fields.keys[1],
            hiddenName: p_obj_store.fields.keys[1],
            typeAhead: true,
            mode: v_str_modoStore,
            width: p_int_anchoCombo,
            forceSelection: true,
            triggerAction: v_str_trigger_action,
            emptyText: p_str_emptyText,
            selectOnFocus: true,
            enableKeyEvents: true,
            lazyRender : true,
            listeners: {
                specialKey: function(field, el){
                    if (el.getKey() == Ext.EventObject.ENTER ||
                        el.getKey() == Ext.EventObject.RETURN /*||
                        el.getKey() == Ext.EventObject.TAB*/) {
                        if (p_str_funcion_accion != "" && p_str_funcion_accion != null) {
                            eval(p_str_funcion_accion + '(this);');
                        }
                        if (field.nextFocus != '' && field.nextFocus != undefined && field.nextFocus != null
                            && el.getKey() == Ext.EventObject.ENTER && (p_str_funcion_accion =='' || p_str_funcion_accion==undefined)){
                            Ext.getCmp(field.nextFocus).focus(true,10);
                        }
                    }
                }
            }
        });
    }
    else{
        return comunes.crear_text_formulario(p_str_id,p_str_label,p_int_anchoCombo,'','',p_boo_campoObligatorio,p_boo_muestraObligatorios,p_boo_readOnly,p_str_funcion_validacion,p_str_funcion_accion,p_str_nextFocus,p_str_valor)
    }
    
}

comunes.crear_check_formulario = function(p_str_id, p_str_label, p_boo_allow_blank, p_int_columnas, p_int_width, p_str_funcion_validacion, p_str_funcion_accion, p_boo_valor) {
    if (p_boo_allow_blank == "0") {
        p_boo_allow_blank = true;
    }
    else {
        p_boo_allow_blank = false;
    }
    
    var v_arr_listado_seleccion = new Array();
    
    v_arr_listado_seleccion[0] = {
        name: p_str_id,
        checked: p_boo_valor
    };
    
    return {
        xtype: 'checkboxgroup',
        fieldLabel: p_str_label,
        columns: p_int_columnas,
        allowBlank: p_boo_allow_blank,
        items: v_arr_listado_seleccion
    };
}

comunes.crear_radio_formulario = function(p_str_id, p_str_label, p_boo_allow_blank, p_int_width, p_str_funcion_validacion, p_str_funcion_accion, p_arr_listado_seleccion){

    var v_arr_listado_seleccion = new Array();
    v_arr_listado_seleccion[v_arr_listado_seleccion.length] = {
        name: p_str_id,
        boxLabel: 'Ninguno',
        inputValue: 0,
        checked: true
    };
    for (v_int_x = 0; v_int_x < p_arr_listado_seleccion.DLCM.length; v_int_x++) {
        v_arr_listado_seleccion[v_arr_listado_seleccion.length] = {
            name: p_str_id,
            boxLabel: p_arr_listado_seleccion.DLCM[v_int_x].DLCM_DET_DESCRIPCION,
            inputValue: p_arr_listado_seleccion.DLCM[v_int_x].DLCM_COD_DESCRIPCION
        };
    }
    return {
        xtype: 'radiogroup',
        fieldLabel: p_str_label,
        // Distribute controls across 3 even columns, filling each row
        // from left to right before starting the next row
        columns: 3,
        items: v_arr_listado_seleccion
    };
}

Ext.override(Ext.form.TextField, {
    validateValue: function(value){
        if (typeof this.validator == "function" && value.length > 0) {
            var msg = this.validator(value);
            if (msg !== true) {
                this.markInvalid(msg);
                return false;
            }
        }
        if (this.vtype) {
            var vt = Ext.form.VTypes;
            if (!vt[this.vtype](value, this)) {
                this.markInvalid(this.vtypeText || vt[this.vtype + 'Text']);
                return false;
            }
        }
        if (this.regex && !this.regex.test(value)) {
            this.markInvalid(this.regexText);
            return false;
        }
        if (value.length < 1 || value === this.emptyText) { // if it's blank
            if (this.allowBlank) {
                this.clearInvalid();
                return true;
            }
            else {
                this.markInvalid(this.blankText);
                return false;
            }
        }
        if (value.length < this.minLength) {
            this.markInvalid(String.format(this.minLengthText, this.minLength));
            return false;
        }
        if (value.length > this.maxLength) {
            this.markInvalid(String.format(this.maxLengthText, this.maxLength));
            return false;
        }
        return true;
    }
    
});
